#ifndef BAIDUPAN_H
#define BAIDUPAN_H
#include <QObject>
#include <QJsonDocument>
#include <QJsonObject>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QFile>
#include <QNetworkAccessManager>
#include <QtQml/qqmlregistration.h>

class BaiduPan : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString client_id MEMBER client_id)
    Q_PROPERTY(QString pan_name MEMBER pan_name)
    QML_UNCREATABLE("")

public:
    /** 百度网盘的申请的client_id */
    QString client_id;
    /** 百度网盘的申请的名称 */
    QString pan_name;
    /** 构造函数 */
    explicit BaiduPan(QObject *parent = nullptr);
    /** 用户信息 */
    Q_INVOKABLE QString info();
    /** 文件列表 */
    Q_INVOKABLE QString list(QString path);
    /** 获取网盘容量信息 */
    Q_INVOKABLE QString quota();
    /** 文件列表所有 */
    Q_INVOKABLE QString listAll(QString path);
    /** 文件管理删除 */
    Q_INVOKABLE QString remove(QString path);
    /** 文件管理移动 */
    Q_INVOKABLE QString move(QString path, QString dest, QString newname);
    /** 文件管理复制 */
    Q_INVOKABLE QString copy(QString path, QString dest, QString newname);
    /** 文件管理重命名 */
    Q_INVOKABLE QString rename(QString path, QString newname);
    /** 比较盘跟本地文件列表用于下载 */
    Q_INVOKABLE QString cmpPanToLocal(QString lpath, QString spath);
    /** 比较本地跟盘文件列表用于上传 */
    Q_INVOKABLE QString cmpLocalToPan(QString lpath, QString spath);
    /** 上传目录 */
    Q_INVOKABLE void upload(QString lpath, QString spath);
    /** 下载目录 */
    Q_INVOKABLE void download(QString lpath, QString spath);
    /** 创建本地路径 */
    Q_INVOKABLE void createLocalPath(QString path);
    /** 本地文件列表所有 */
    Q_INVOKABLE QString localAll(QString path);
private:
    /** http请求对象 */
    QNetworkAccessManager *manager;
    /** 请求返回 */
    QNetworkReply *reply;
    /** 请求返回数据 */
    QByteArray bta;
    /** http请求 */
    QString http(QString url, QByteArray data = QByteArray());
    /** 下载文件保持的文件 */
    QFile saveFile;
    /** 检查服务上是否存在本地的文件 */
    void checkLocalPan(QString lpath, qsizetype blen, QString spath, QJsonArray pfiles, QJsonArray &ret);
    /** 本地文件列表 */
    void localFile(QString path, QJsonArray &ret);

signals:
    /** 下载字节变化 */
    void loadChange(qsizetype);
    /** 下载出错了 */
    void loadError(QString);
    /** 下载完成 */
    void loadFinish();

    /** 上传字节变化 */
    void uploadChange(qsizetype);
    /** 上传出错了 */
    void uploadError(QString);
    /** 上传完成 */
    void uploadFinish();
};

#endif // BAIDUPAN_H
